#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <getch.h>
#include <stdbool.h>
#include <string.h>
#include "tools.h"
#include "client.h"

static int msgid_ctos;
static int msgid_stoc;

static void open_account(void) // TYPE_OPEN
{	
	Msg msg_ctos = {};
	msg_ctos.type = TYPE_OPEN;	
	char name[5];
	char pwd[20];
	char again_pwd[20];
	printf("请输入姓名:\n");
	gets(name);
	printf("请输入身份证号：\n");
	gets(msg_ctos.user.id);
	printf("请输入密码:\n");
	gets(pwd);
	printf("请再次输入密码:\n");
	gets(again_pwd);
	for(;;)
	{
		if(0 == strcmp(pwd,again_pwd))
		{
			strcpy(msg_ctos.user.pwd,pwd);
			break;
		}
		else
		{
			printf("请再次输入密码:\n");
			gets(again_pwd);
		}
	}
	msg_ctos.user.account = 0;
	msg_ctos.user.money = 0,msg_ctos.pid = getpid();
	msg_ctos.user.cnt = 0;
	msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0);
	Msg msg_stoc = {};
	if(0 > msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0))
	{
		perror("msgrcv");
		return;
	}else
	{
		puts(msg_stoc.result);
	}
}

static void destroy_account(void) // TYPE_DESTORY
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	puts("请输入销毁的账号:");
	scanf("%d",&msg_ctos.user.account);
	puts("请输入密码:");
	scanf("%s",msg_ctos.user.pwd);
	msg_ctos.type = TYPE_DESTORY;
	msg_ctos.pid = getpid();
	msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0);
	
	if(0 > msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0))
	{
		perror("msgrcv");
		return;
	}
	else
	{
		puts(msg_stoc.result);
	}
}

static int user_login(void)	// TYPE_LOGIN
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	msg_ctos.type = TYPE_LOGIN;
	puts("请输入账号：");
	scanf("%d",&msg_ctos.user.account);
	msg_ctos.pid = getpid();
	puts("请输入密码");
	scanf("%s",msg_ctos.user.pwd);
	if(0 > msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0))
	{
		perror("msgsnd");
	}
	if(0 > msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0))
	{
		perror("msgrcv");
	}
	puts(msg_stoc.result);
	if(0 == strcmp(msg_stoc.result,"登录成功"))
	{
		return msg_ctos.user.account;
	}
	else
	{
		return -1;
	}
	return -1;
}

static void user_unlock(void) // TYPE_UNLOCK
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	msg_ctos.type = TYPE_UNLOCK;
	User user = {};
	printf("请输入要解锁的账号：\n");
	scanf("%d",&msg_ctos.user.account);
	printf("请输入身份证号:\n");
	scanf("%s",msg_ctos.user.id);
	msg_ctos.pid = getpid();
	if(0 > msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0))
	{
		perror("msgsnd");
		return;
	}
	if(0 > msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0))
	{
		perror("msgrcv");
		return;
	}
	puts(msg_stoc.result);
}

static void save(int user_account) // TYPE_SAVE
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	puts("请输入要存的金额");
	scanf("%d",&msg_ctos.user.money);
	msg_ctos.user.account = user_account;
	msg_ctos.type = TYPE_SAVE;
	msg_ctos.pid = getpid();
	if(0 > msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0))
	{
		perror("msgsnd");
		return;
	}
	
	msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0);
	puts(msg_stoc.result);
}

static void take(int user_account) // TYPE_TAKE
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	printf("请输入取的金额\n");
	scanf("%d",&msg_ctos.user.money);
	msg_ctos.user.account = user_account;
	msg_ctos.type = TYPE_TAKE;
	msg_ctos.pid = getpid();
	if(0 > (msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0)))
	{
		perror("msgsnd");
		return;
	}
	
	msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0);
	puts(msg_stoc.result);
}

static void transfer(int user_account) // TYPE_TRANSF
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	char target_account[50];
	msg_ctos.type = TYPE_TRANSF;
	msg_ctos.user.account = user_account;
	printf("请输入目标账户\n");
	scanf("%s",msg_ctos.user.id);
	printf("请输入转账金额\n");
	scanf("%d",&msg_ctos.user.money);
	msg_ctos.pid = getpid();
	if(0 > msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0))
	{
		perror("msgsnd");
		return;
	}
	
	msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0);
	puts(msg_stoc.result);
}

static void query(int user_account) // TYPE_QUERY
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	msg_ctos.user.account = user_account;
	msg_ctos.type = TYPE_QUERY;
	msg_ctos.pid = getpid();
	msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0);
	
	msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0);
	puts(msg_stoc.result);
}

static void change_pwd(int user_account)
{
	Msg msg_ctos = {};
	Msg msg_stoc = {};
	puts("请输入旧密码");
	msg_ctos.type = TYPE_CHPWD;
	msg_ctos.user.account = user_account;
	gets(msg_ctos.user.pwd);
	puts("请输入新密码");
	gets(msg_ctos.user.id);
	msg_ctos.pid = getpid();
	msgsnd(msgid_ctos,&msg_ctos,sizeof(Msg)-sizeof(msg_ctos.type),0);
	msgrcv(msgid_stoc,&msg_stoc,sizeof(Msg),msg_ctos.pid,0);
	puts(msg_stoc.result);
}

static void login_menu(void)
{
	int user_account = user_login();
	while(0 < user_account)
	{
		clear_screen();
		puts("请选择要进行的操作");
		puts("1、存钱");
		puts("2、取钱");
		puts("3、转账");
		puts("4、查询");
		puts("5、修改密码");
		puts("6、退出");
		switch(get_cmd('1','6'))
		{
			case '1': save(user_account); break;
			case '2': take(user_account); break;
			case '3': transfer(user_account); break;
			case '4': query(user_account); break;
			case '5': change_pwd(user_account); break;
			case '6': return;
		}
	}
}

void main_menu(void)
{
	for(;;)
	{
		clear_screen();
		puts("请选择要进行的操作：");
		puts("1、开户");
		puts("2、销户");
		puts("3、登录");
		puts("4、解锁");
		switch(get_cmd('1','5'))
		{
			case '1': open_account(); break;
			case '2': destroy_account(); break;
			case '3': login_menu(); break;
			case '4': user_unlock(); break;
			case '5': return;
		}
	}
}

int main()
{
	msgid_ctos = get_ctos_msg();
	msgid_stoc = get_stoc_msg();
	main_menu();
}
